#include"stm32f10x.h"
#include"uart.h"
#include"GPRS.h"
#include"uCOS_Include.h"
#include"string.h"
#include <stdio.h>

extern OS_FLAG_GRP *Flag_Grp;

/*GPRS数据发送不成功的缓存变量*/
u8 i;
u8 Buf_Start;					//缓存数组中有数据
int16_t Alarm_Num_Up=0;	 		//每缓存一组数据就加1
int16_t Alarm_Num_Down=0; 		 //缓存数组中每发送一组数据就减1
u8 GPRS_Data_Buf[160][37]={{0}}; //缓存数组	 145  3s一次  7.25min
u8 data_buff[7];

u8 GPRS_Send_flag;
u8 Buf_Send_flag=0;
extern u8 Buf_flag;
extern uint16_t Update_Rate;
extern u8 Alarm_Location_W;	//报警区域位置显示
extern u8 Alarm_Location_Z;	//报警区域位置显示
extern u8 Alarm_Location_Flag;	//报警区域位置显示
u8 OPEN=0;
u8 Init_ATE0=0;
u8 IP_CALL=0;
u8 Push_Down=0;
u8 Buf_Over=0;
extern u8 sent_CMD;
static u8 SendTo3GModuleBuff[250] = {0};
u32 SendDataNumber = 0;

extern Function_cb g_send_cb;
extern u8 heart_rate_respose;
static u8 no_respose_time = 0;
extern u8 send_time;

/****************************************************************/
/*函数功能：发送附加信息										*/
/*入口参数：Flag，Alarm											*/
/*出口参数：无													*/
/*参数说明：Flag为1表示已定位，0为未定位						*/
/*			Alarm为1表示超速，0为未超速							*/
/****************************************************************/
void Send_Other(void)
{
	UART1Write("2641");						//发送“&A”
	UART1Write(AscllToHEX(time));		    //发送时间（如120000，表示20点0分0秒）
	UART1Write(AscllToHEX(weidu));			//发送经度（如29031975，表示经度2903.1975）
	UART1Write(AscllToHEX(jingdu));			//发送纬度（如111392000，表示经度11139.2000）
		
	if(Statu_Flag==1)
		UART1Write("36");   				//高半字节表示星期（0～6），低半字节表示经纬度
	if(Statu_Flag==0)						//Statu_Flag=0：未定位
		UART1Write("37");					//Statu_Flag=1：已定位

	UART1Write(AscllToHEX(speed1));			//发送速度1：2位，单位为两节
	UART1Write("3030");	 					//发送“00“，表示方向，单位是10度，正北为0度，顺时针方向
	UART1Write(AscllToHEX(date));			//发送日期，格式为ddmmyy,顺序为日，月，年
	UART1Write("26423031303038");			//发送报警状态信息：&B0100804000或B0000000000分别表示为超速报警与正常		
	UART1Write("3030303030");
/*
	if(Alarm==0x01)
		UART1Write("34");	  				//'4' &B01008 00004	 直道超速报警
	else if(Alarm_W==0x01)
		UART1Write("38");   				//'8' &B01008 00008	 弯道超速报警
	else		
	   UART1Write("30");  */

	UART1Write("2646");						//发送附加信息起始符	&F
	UART1Write(AscllToHEX(speed2));			//发送速度2，如&F0458表示当前速度为45.8节，即84.8 Km/h。
}	

/****************************************************************/
/*函数功能：发送附加信息										*/
/*入口参数：Flag，Alarm											*/
/*出口参数：无													*/
/*参数说明：Flag为1表示已定位，0为未定位						*/
/*			Alarm为1表示超速，0为未超速							*/
/****************************************************************/
void Send_Other_Alarm(void)
{
	UART1Write("2641");						//发送“&A”
	UART1Write(AscllToHEX(time_Alarm));		    //发送时间（如120000，表示20点0分0秒）
	UART1Write(AscllToHEX(weidu_Alarm));			//发送经度（如29031975，表示经度2903.1975）
	UART1Write(AscllToHEX(jingdu_Alarm));			//发送纬度（如111392000，表示经度11139.2000）
		
	if(Statu_Flag==1)
		UART1Write("36");   				//高半字节表示星期（0～6），低半字节表示经纬度
	if(Statu_Flag==0)						//Statu_Flag=0：未定位
		UART1Write("37");					//Statu_Flag=1：已定位

	UART1Write(AscllToHEX(speed1_Alarm));			//发送速度1：2位，单位为两节
	UART1Write("3030");	 					//发送“00“，表示方向，单位是10度，正北为0度，顺时针方向
	UART1Write(AscllToHEX(date_Alarm));			//发送日期，格式为ddmmyy,顺序为日，月，年
	UART1Write("26423031303038");			//发送报警状态信息：&B0100804000或B0000000000分别表示为超速报警与正常		
	UART1Write("30303030");

	if(Alarm)
	{
		Alarm=0;
		UART1Write("34");	  				//'4' &B01008 00004	 直道超速报警
		if((Alarm_Location_Flag>0&&Alarm_Location_Flag<45)||(Alarm_Location_Flag==100))
		{
			if((Alarm_Location_Flag==4||Alarm_Location_Flag==5)&&(speed1_Alarm[0]==0x30))
			{
				AT_Command(0x08);
			}
			else
			{
				u8_to_Hex(Alarm_Location_Flag);
			}
		}
		else
		{
			if(Alarm_Location_Z>0&&Alarm_Location_Z<45)
			{
			   if((Alarm_Location_Z==4||Alarm_Location_Z==5)&&(speed1_Alarm[0]==0x30))
				{
					AT_Command(0x08);
				}
				else
				{
					u8_to_Hex(Alarm_Location_Z);
				}			   
			}
			else if(Alarm_Location_W)	   
			{							
				u8_to_Hex(Alarm_Location_W);   //通过弯道区域来获取直道区域
			}
			else
			{
			   AT_Command(0x08);
			}
		}
	}
	else if(Alarm_W)
	{
		Alarm_W=0;
		UART1Write("38");   				//'8' &B01008 00008	 弯道超速报警	    
		if(Alarm_Location_Flag>100&&Alarm_Location_Flag<136)
		{
			u8_to_Hex(Alarm_Location_Flag);
		}
		else
		{
			if(Alarm_Location_W>100&&Alarm_Location_W<136)
			{
			   u8_to_Hex(Alarm_Location_W);
			}
			else
			{
				AT_Command(0x08);
			}
		}
	}
	else
	{
	   UART1Write("30");  
	}

	UART1Write("2646");						//发送附加信息起始符	&F
	UART1Write(AscllToHEX(speed2_Alarm));			//发送速度2，如&F0458表示当前速度为45.8节，即84.8 Km/h。

	UART1Write("265A");						//发送区域报警附加信息起始符  &Z
	UART1Write("3030");						//发送D0D1D2D3D4   	
	UART1Write(data_buff);

}
						  
/****************************************************************/
/*函数功能：发送登陆信息										*/
/*入口参数：无													*/
/*出口参数：无													*/
/*函数说明：Flag为1表示已定位，0为未定位						*/
/*			Alarm为1表示超速，0为未超速							*/
/****************************************************************/
void Send_Log(void)
{
	u16 SendLen = 0, Crc_Tmp;
	SEND=1;
	START=9;
	REPLY=6;
	
	SendTo3GModuleBuff[0] = 0x55;
	SendTo3GModuleBuff[1] = 0xAA;			//透传起始位

	SendTo3GModuleBuff[4] = 0x07;		    //设备类型
	SendTo3GModuleBuff[5] = 0x01;		    //厂商标识

	SendTo3GModuleBuff[6] = 0x00;
	SendTo3GModuleBuff[7] = 0x22;		    //透传命令字

	SendTo3GModuleBuff[8] = 0x00;			//链路编号

	SendDataNumber++;
    
    SendTo3GModuleBuff[9] = (SendDataNumber >> 24)&0xff;
    SendTo3GModuleBuff[10] = (SendDataNumber >> 16)&0xff;
	SendTo3GModuleBuff[11] = (SendDataNumber >> 8)&0xff;
	SendTo3GModuleBuff[12] = SendDataNumber & 0xff;		 //透传数据流水号

	SendLen = 13;

//	UART1Write("AT+MIPSEND=1,");			//发送数据AT指令
	
//	UART1Write("\"2A4851323030");			//发送“*HQ200”
	SendLen += LoadToSendBuff("*HQ201", &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(id));				//发送SIM卡号（11位数字）
	SendLen += LoadToSendBuff(id, &SendTo3GModuleBuff[SendLen]);
//	UART1Write("2C");
	SendLen += LoadToSendBuff(",", &SendTo3GModuleBuff[SendLen]);
//	UART1Write("414230");					//发送“AB1”
	SendLen += LoadToSendBuff("AB1", &SendTo3GModuleBuff[SendLen]);

//	Send_Other();							//发送附加信息
	
//	UART1Write("2641");						//发送“&A”
	SendLen += LoadToSendBuff("&A", &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(time));		    //发送时间（如120000，表示20点0分0秒）
	SendLen += LoadToSendBuff(time, &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(weidu));			//发送经度（如29031975，表示经度2903.1975）
	SendLen += LoadToSendBuff(weidu, &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(jingdu));			//发送纬度（如111392000，表示经度11139.2000）
	SendLen += LoadToSendBuff(jingdu, &SendTo3GModuleBuff[SendLen]);
		
	if(Statu_Flag==1)
	SendLen += LoadToSendBuff("6", &SendTo3GModuleBuff[SendLen]);
//		UART1Write("36");   				//高半字节表示星期（0～6），低半字节表示经纬度
	if(Statu_Flag==0)						//Statu_Flag=0：未定位
	SendLen += LoadToSendBuff("7", &SendTo3GModuleBuff[SendLen]);
//		UART1Write("37");					//Statu_Flag=1：已定位

//	UART1Write(AscllToHEX(speed1));			//发送速度1：2位，单位为两节
	SendLen += LoadToSendBuff(speed1, &SendTo3GModuleBuff[SendLen]);
//	UART1Write("3030");	 					//发送“00“，表示方向，单位是10度，正北为0度，顺时针方向
	SendLen += LoadToSendBuff("00", &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(date));			//发送日期，格式为ddmmyy,顺序为日，月，年
	SendLen += LoadToSendBuff(date, &SendTo3GModuleBuff[SendLen]);
//	UART1Write("26423031303038");			//发送报警状态信息：&B0100804000或B0000000000分别表示为超速报警与正常
	SendLen += LoadToSendBuff("&B01008", &SendTo3GModuleBuff[SendLen]);		
//	UART1Write("3030303030");
	SendLen += LoadToSendBuff("00000", &SendTo3GModuleBuff[SendLen]);

//	UART1Write("2646");						//发送附加信息起始符	&F
	SendLen += LoadToSendBuff("&F", &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(speed2));			//发送速度2，如&F0458表示当前速度为45.8节，即84.8 Km/h。
	SendLen += LoadToSendBuff(speed2, &SendTo3GModuleBuff[SendLen]);


//	UART1Write("23\"");						//发送结束符‘#’
	SendLen += LoadToSendBuff("#", &SendTo3GModuleBuff[SendLen]);


//	UART1_SendByte('\r');					//发送结束
	SendTo3GModuleBuff[2] = (SendLen-4) >> 8;
	SendTo3GModuleBuff[3] = (SendLen-4) & 0xFF;	   		//数据长度

	Crc_Tmp = CalCrc((char *)&SendTo3GModuleBuff[2], SendLen-2);
	SendTo3GModuleBuff[SendLen++] = Crc_Tmp & 0xFF;		//校验码
	SendTo3GModuleBuff[SendLen++] = 0x55;
	SendTo3GModuleBuff[SendLen++] = 0xAA;				//结束位

	UART1WriteBuff(SendTo3GModuleBuff, SendLen);   		//发送到串口
    
//    LOG("%s",SendTo3GModuleBuff);

	Buf_function=Function;
	Function=4;
    OSTimeDlyHMSM(0,0,0,500);
}


/****************************************************************/
/*函数功能：发送进入GPRS状态信息								*/
/*入口参数：无      											*/
/*出口参数：无													*/
/*函数说明：Flag为1表示已定位，0为未定位						*/
/*			Alarm为1表示超速，0为未超速							*/
/****************************************************************/
void GPRS_Ready(void)
{
	u16 SendLen = 0, Crc_Tmp;
	SEND=1;
	START=9;
	REPLY=7;
	
	SendTo3GModuleBuff[0] = 0x55;
	SendTo3GModuleBuff[1] = 0xAA;			//透传起始位

	SendTo3GModuleBuff[4] = 0x07;		    //设备类型
	SendTo3GModuleBuff[5] = 0x01;		    //厂商标识

	SendTo3GModuleBuff[6] = 0x00;
	SendTo3GModuleBuff[7] = 0x22;		    //透传命令字

	SendTo3GModuleBuff[8] = 0x00;			//链路编号

	SendDataNumber++;
    SendTo3GModuleBuff[9] = (SendDataNumber >> 24)&0xff;
    SendTo3GModuleBuff[10] = (SendDataNumber >> 16)&0xff;
	SendTo3GModuleBuff[11] = (SendDataNumber >> 8)&0xff;
	SendTo3GModuleBuff[12] = SendDataNumber & 0xff;		 //透传数据流水号

	SendLen = 13;

//	UART1Write("AT+MIPSEND=1,");			//发送数据AT指令
	
//	UART1Write("\"2A4851323030");			//发送数据头*HQ200AD1
	SendLen += LoadToSendBuff("*HQ200", &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(id));				//发送SIM卡号（11位数字）
	SendLen += LoadToSendBuff(id, &SendTo3GModuleBuff[SendLen]);
//	UART1Write("2C");			  			//发送逗号
	SendLen += LoadToSendBuff(",", &SendTo3GModuleBuff[SendLen]);
//	UART1Write("414431");					//发送数据头AD1
	SendLen += LoadToSendBuff("AD1", &SendTo3GModuleBuff[SendLen]);

//	Send_Other();							//发送附加信息
	
//	UART1Write("2641");						//发送“&A”
	SendLen += LoadToSendBuff("&A", &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(time));		    //发送时间（如120000，表示20点0分0秒）
	SendLen += LoadToSendBuff(time, &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(weidu));			//发送经度（如29031975，表示经度2903.1975）
	SendLen += LoadToSendBuff(weidu, &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(jingdu));			//发送纬度（如111392000，表示经度11139.2000）
	SendLen += LoadToSendBuff(jingdu, &SendTo3GModuleBuff[SendLen]);
		
	if(Statu_Flag==1)
	SendLen += LoadToSendBuff("6", &SendTo3GModuleBuff[SendLen]);
//		UART1Write("36");   				//高半字节表示星期（0～6），低半字节表示经纬度
	if(Statu_Flag==0)						//Statu_Flag=0：未定位
	SendLen += LoadToSendBuff("7", &SendTo3GModuleBuff[SendLen]);
//		UART1Write("37");					//Statu_Flag=1：已定位

//	UART1Write(AscllToHEX(speed1));			//发送速度1：2位，单位为两节
	SendLen += LoadToSendBuff(speed1, &SendTo3GModuleBuff[SendLen]);
//	UART1Write("3030");	 					//发送“00“，表示方向，单位是10度，正北为0度，顺时针方向
	SendLen += LoadToSendBuff("00", &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(date));			//发送日期，格式为ddmmyy,顺序为日，月，年
	SendLen += LoadToSendBuff(date, &SendTo3GModuleBuff[SendLen]);
//	UART1Write("26423031303038");			//发送报警状态信息：&B0100804000或B0000000000分别表示为超速报警与正常
	SendLen += LoadToSendBuff("&B01008", &SendTo3GModuleBuff[SendLen]);		
//	UART1Write("3030303030");
	SendLen += LoadToSendBuff("00000", &SendTo3GModuleBuff[SendLen]);

//	UART1Write("2646");						//发送附加信息起始符	&F
	SendLen += LoadToSendBuff("&F", &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(speed2));			//发送速度2，如&F0458表示当前速度为45.8节，即84.8 Km/h。
	SendLen += LoadToSendBuff(speed2, &SendTo3GModuleBuff[SendLen]);


//	UART1Write("23\"");						//发送结束符‘#’
	SendLen += LoadToSendBuff("#", &SendTo3GModuleBuff[SendLen]);

//	UART1_SendByte('\r');					//发送结束
	SendTo3GModuleBuff[2] = (SendLen-4) >> 8;
	SendTo3GModuleBuff[3] = (SendLen-4) & 0xFF;	   		//数据长度

	Crc_Tmp = CalCrc((char *)&SendTo3GModuleBuff[2], SendLen-2);
	SendTo3GModuleBuff[SendLen++] = Crc_Tmp & 0xFF;		//校验码
	SendTo3GModuleBuff[SendLen++] = 0x55;
	SendTo3GModuleBuff[SendLen++] = 0xAA;				//结束位

	UART1WriteBuff(SendTo3GModuleBuff, SendLen);   		//发送到串口

	Buf_function=Function;
	Function=3;	
}



/****************************************************************/
/*函数功能：定时上传心跳包(需要回复)							*/
/*入口参数：无      											*/
/*出口参数：无													*/
/*函数说明：Flag为1表示已定位，0为未定位						*/
/*			Alarm为1表示超速，0为未超速							*/
/****************************************************************/
void Heart_Jump(void)
{
	u16 SendLen = 0, Crc_Tmp;
	SEND=1;
	START=9;
	REPLY=8;
	
//	UART1Write("AT+MIPSEND=1,");			//发送数据AT指令
	SendTo3GModuleBuff[0] = 0x55;
	SendTo3GModuleBuff[1] = 0xAA;			//透传起始位

	SendTo3GModuleBuff[4] = 0x07;		    //设备类型
	SendTo3GModuleBuff[5] = 0x01;		    //厂商标识

	SendTo3GModuleBuff[6] = 0x00;
	SendTo3GModuleBuff[7] = 0x22;		    //透传命令字

	SendTo3GModuleBuff[8] = 0x00;			//链路编号

	SendDataNumber++;
    SendTo3GModuleBuff[9] = (SendDataNumber >> 24)&0xff;
    SendTo3GModuleBuff[10] = (SendDataNumber >> 16)&0xff;
	SendTo3GModuleBuff[11] = (SendDataNumber >> 8)&0xff;
	SendTo3GModuleBuff[12] = SendDataNumber & 0xff;		 //透传数据流水号

	SendLen = 13;


//	UART1Write("\"2A4851323031");			//发送数据头*HQ201
	SendLen += LoadToSendBuff("*HQ201", &SendTo3GModuleBuff[SendLen]);

//	UART1Write(AscllToHEX(id));				//发送SIM卡号（11位数字）
	SendLen += LoadToSendBuff(id, &SendTo3GModuleBuff[SendLen]);

//	UART1Write("2C");					  	//发送逗号
	SendLen += LoadToSendBuff(",", &SendTo3GModuleBuff[SendLen]);

//	UART1Write("4148");						//发送数据头AH
	SendLen += LoadToSendBuff("AH", &SendTo3GModuleBuff[SendLen]);

	 /* 发送附加信息 */
//	Send_Other();							//发送附加信息
//	UART1Write("2641");						//发送“&A”
	SendLen += LoadToSendBuff("&A", &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(time));		    //发送时间（如120000，表示20点0分0秒）
	SendLen += LoadToSendBuff(time, &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(weidu));			//发送经度（如29031975，表示经度2903.1975）
	SendLen += LoadToSendBuff(weidu, &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(jingdu));			//发送纬度（如111392000，表示经度11139.2000）
	SendLen += LoadToSendBuff(jingdu, &SendTo3GModuleBuff[SendLen]);
		
	if(Statu_Flag==1)
		SendLen += LoadToSendBuff("6", &SendTo3GModuleBuff[SendLen]);
//		UART1Write("36");   				//高半字节表示星期（0～6），低半字节表示经纬度
		
	if(Statu_Flag==0)						//Statu_Flag=0：未定位
		SendLen += LoadToSendBuff("7", &SendTo3GModuleBuff[SendLen]);
//		UART1Write("37");					//Statu_Flag=1：已定位
		
//	UART1Write(AscllToHEX(speed1));			//发送速度1：2位，单位为两节
	SendLen += LoadToSendBuff(speed1, &SendTo3GModuleBuff[SendLen]);
//	UART1Write("3030");	 					//发送“00“，表示方向，单位是10度，正北为0度，顺时针方向
	SendLen += LoadToSendBuff("00", &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(date));			//发送日期，格式为ddmmyy,顺序为日，月，年
	SendLen += LoadToSendBuff(date, &SendTo3GModuleBuff[SendLen]);
//	UART1Write("26423031303038");			//发送报警状态信息：&B0100804000或B0000000000分别表示为超速报警与正常
	SendLen += LoadToSendBuff("&B01008", &SendTo3GModuleBuff[SendLen]);		
//	UART1Write("3030303030");
	SendLen += LoadToSendBuff("00000", &SendTo3GModuleBuff[SendLen]);

//	UART1Write("2646");						//发送附加信息起始符	&F
	SendLen += LoadToSendBuff("&F", &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(speed2));			//发送速度2，如&F0458表示当前速度为45.8节，即84.8 Km/h。
	SendLen += LoadToSendBuff(speed2, &SendTo3GModuleBuff[SendLen]);



//	UART1Write("23\"");						//发送结束符‘#’
	SendLen += LoadToSendBuff("#", &SendTo3GModuleBuff[SendLen]);

//	UART1_SendByte('\r');					//发送结束

	SendTo3GModuleBuff[2] = (SendLen-4) >> 8;
	SendTo3GModuleBuff[3] = (SendLen-4) & 0xFF;	   		//数据长度

	Crc_Tmp = CalCrc((char *)&SendTo3GModuleBuff[2], SendLen-2);
	SendTo3GModuleBuff[SendLen++] = Crc_Tmp & 0xFF;		//校验码
	SendTo3GModuleBuff[SendLen++] = 0x55;
	SendTo3GModuleBuff[SendLen++] = 0xAA;				//结束位

	UART1WriteBuff(SendTo3GModuleBuff, SendLen);   		//发送到串口

	Buf_function=Function; 
	Function=3;
}


/****************************************************************/
/*函数功能：上传报警信息(需要回复)								*/
/*入口参数：无      											*/
/*出口参数：无													*/
/*函数说明：Flag为1表示已定位，0为未定位						*/
/*			Alarm为1表示超速，0为未超速							*/
/****************************************************************/
void Alarm_Message(void)
{
	u16 SendLen = 0, Crc_Tmp;
	SEND=1;
	START=9;
	REPLY=9;
	
	SendTo3GModuleBuff[0] = 0x55;
	SendTo3GModuleBuff[1] = 0xAA;			//透传起始位

	SendTo3GModuleBuff[4] = 0x07;		    //设备类型
	SendTo3GModuleBuff[5] = 0x01;		    //厂商标识

	SendTo3GModuleBuff[6] = 0x00;
	SendTo3GModuleBuff[7] = 0x22;		    //透传命令字

	SendTo3GModuleBuff[8] = 0x00;			//链路编号

	SendDataNumber++;
    SendTo3GModuleBuff[9] = (SendDataNumber >> 24)&0xff;
    SendTo3GModuleBuff[10] = (SendDataNumber >> 16)&0xff;
	SendTo3GModuleBuff[11] = (SendDataNumber >> 8)&0xff;
	SendTo3GModuleBuff[12] = SendDataNumber & 0xff;		 //透传数据流水号

	SendLen = 13;
	

//	UART1Write("AT+MIPSEND=1,");			//发送数据AT指令
	
//	UART1Write("\"2A4851323030");			//发送数据头*HQ200
	SendLen += LoadToSendBuff("*HQ200", &SendTo3GModuleBuff[SendLen]);

//	UART1Write(AscllToHEX(id));				//发送SIM卡号（11位数字）
	SendLen += LoadToSendBuff(id, &SendTo3GModuleBuff[SendLen]);

//	UART1Write("2C");					  	//发送逗号
	SendLen += LoadToSendBuff(",", &SendTo3GModuleBuff[SendLen]);

//	UART1Write("4141");						//发送数据AA
	SendLen += LoadToSendBuff("AA", &SendTo3GModuleBuff[SendLen]);
							
//	Send_Other_Alarm();						 //发送附加信息

//	UART1Write("2641");						//发送“&A”
	SendLen += LoadToSendBuff("&A", &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(time_Alarm));		//发送时间（如120000，表示20点0分0秒）
	SendLen += LoadToSendBuff(time_Alarm, &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(weidu_Alarm));	//发送经度（如29031975，表示经度2903.1975）
	SendLen += LoadToSendBuff(weidu_Alarm, &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(jingdu_Alarm));	//发送纬度（如111392000，表示经度11139.2000）
	SendLen += LoadToSendBuff(jingdu_Alarm, &SendTo3GModuleBuff[SendLen]);
		
	if(Statu_Flag==1)
		SendLen += LoadToSendBuff("6", &SendTo3GModuleBuff[SendLen]);
//		UART1Write("36");   				//高半字节表示星期（0～6），低半字节表示经纬度
	if(Statu_Flag==0)						//Statu_Flag=0：未定位
		SendLen += LoadToSendBuff("7", &SendTo3GModuleBuff[SendLen]);
//		UART1Write("37");					//Statu_Flag=1：已定位

//	UART1Write(AscllToHEX(speed1_Alarm));	//发送速度1：2位，单位为两节
	SendLen += LoadToSendBuff(speed1_Alarm, &SendTo3GModuleBuff[SendLen]);
//	UART1Write("3030");	 					//发送“00“，表示方向，单位是10度，正北为0度，顺时针方向
	SendLen += LoadToSendBuff("00", &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(date_Alarm));		//发送日期，格式为ddmmyy,顺序为日，月，年
	SendLen += LoadToSendBuff(date_Alarm, &SendTo3GModuleBuff[SendLen]);
//	UART1Write("26423031303038");			//发送报警状态信息：&B0100804000或B0000000000分别表示为超速报警与正常
	SendLen += LoadToSendBuff("&B01008", &SendTo3GModuleBuff[SendLen]);		
//	UART1Write("30303030");
	SendLen += LoadToSendBuff("0000", &SendTo3GModuleBuff[SendLen]);

	if(Alarm)
	{
		Alarm=0;
//		UART1Write("34");	  				//'4' &B01008 00004	 直道超速报警
		SendLen += LoadToSendBuff("4", &SendTo3GModuleBuff[SendLen]);
		if((Alarm_Location_Flag>0&&Alarm_Location_Flag<45)||(Alarm_Location_Flag==100))
		{
			if((Alarm_Location_Flag==4||Alarm_Location_Flag==5)&&(speed1_Alarm[0]==0x30))
			{
			//	AT_Command(0x08);
			}
			else
			{
				u8_to_Hex(Alarm_Location_Flag);
			}
		}
		else
		{
			if(Alarm_Location_Z>0&&Alarm_Location_Z<45)
			{
			   if((Alarm_Location_Z==4||Alarm_Location_Z==5)&&(speed1_Alarm[0]==0x30))
				{
			//		AT_Command(0x08);
				}
				else
				{
					u8_to_Hex(Alarm_Location_Z);
				}			   
			}
			else if(Alarm_Location_W)	   
			{							
				u8_to_Hex(Alarm_Location_W);   //通过弯道区域来获取直道区域
			}
			else
			{
		//	   AT_Command(0x08);
			}
		}
	}
	else if(Alarm_W)
	{
		Alarm_W=0;
//		UART1Write("38");   				//'8' &B01008 00008	 弯道超速报警	
		SendLen += LoadToSendBuff("8", &SendTo3GModuleBuff[SendLen]);    
		if(Alarm_Location_Flag>100&&Alarm_Location_Flag<136)
		{
			u8_to_Hex(Alarm_Location_Flag);
		}
		else
		{
			if(Alarm_Location_W>100&&Alarm_Location_W<136)
			{
			   u8_to_Hex(Alarm_Location_W);
			}
			else
			{
		//		AT_Command(0x08);
			}
		}
	}
	else
	{
//	   UART1Write("30");  
	   SendLen += LoadToSendBuff("0", &SendTo3GModuleBuff[SendLen]);
	}

//	UART1Write("2646");						//发送附加信息起始符	&F
	SendLen += LoadToSendBuff("&F", &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(speed2_Alarm));	//发送速度2，如&F0458表示当前速度为45.8节，即84.8 Km/h。
	SendLen += LoadToSendBuff(speed2_Alarm, &SendTo3GModuleBuff[SendLen]);

//	UART1Write("265A");						//发送区域报警附加信息起始符  &Z
	SendLen += LoadToSendBuff("&Z", &SendTo3GModuleBuff[SendLen]);
//	UART1Write("3030");						//发送D0D1D2D3D4  
	SendLen += LoadToSendBuff("00", &SendTo3GModuleBuff[SendLen]); 	
//	UART1Write(data_buff);
	SendLen += LoadToSendBuff(data_buff, &SendTo3GModuleBuff[SendLen]);



//	UART1Write("23\"");						//发送结束符‘#’
	SendLen += LoadToSendBuff("#", &SendTo3GModuleBuff[SendLen]);

 //	UART1_SendByte('\r');					//发送结束

	SendTo3GModuleBuff[2] = (SendLen-4) >> 8;
	SendTo3GModuleBuff[3] = (SendLen-4) & 0xFF;	   		//数据长度

	Crc_Tmp = CalCrc((char *)&SendTo3GModuleBuff[2], SendLen-2);
	SendTo3GModuleBuff[SendLen++] = Crc_Tmp & 0xFF;		//校验码
	SendTo3GModuleBuff[SendLen++] = 0x55;
	SendTo3GModuleBuff[SendLen++] = 0xAA;				//结束位

	UART1WriteBuff(SendTo3GModuleBuff, SendLen);   		//发送到串口
		
	Buf_function=Function;
	Function=3;
	Alarm=0;
	Alarm_W=0;
}


/****************************************************************/
/*函数功能：回传定位信息										*/
/*入口参数：无													*/
/*出口参数：无													*/
/*函数说明：Flag为1表示已定位，0为未定位						*/
/*			Alarm为1表示超速，0为未超速							*/
/****************************************************************/
void Position(void)
{
	u16 SendLen = 0, Crc_Tmp;
	SEND=1;
	START=9;
	REPLY=10;
	
	SendTo3GModuleBuff[0] = 0x55;
	SendTo3GModuleBuff[1] = 0xAA;			//透传起始位

	SendTo3GModuleBuff[4] = 0x07;		    //设备类型
	SendTo3GModuleBuff[5] = 0x01;		    //厂商标识

	SendTo3GModuleBuff[6] = 0x00;
	SendTo3GModuleBuff[7] = 0x22;		    //透传命令字

	SendTo3GModuleBuff[8] = 0x00;			//链路编号

	SendDataNumber++;
    SendTo3GModuleBuff[9] = (SendDataNumber >> 24)&0xff;
    SendTo3GModuleBuff[10] = (SendDataNumber >> 16)&0xff;
	SendTo3GModuleBuff[11] = (SendDataNumber >> 8)&0xff;
	SendTo3GModuleBuff[12] = SendDataNumber & 0xff;		 //透传数据流水号

	SendLen = 13;

//	UART1Write("AT+MIPSEND=1,");			//发送数据AT指令
	
//	UART1Write("\"2A4851323030");			//发送数据头*HQ201 
	SendLen += LoadToSendBuff("*HQ200", &SendTo3GModuleBuff[SendLen]); 
//	UART1Write(AscllToHEX(id));				//发送SIM卡号（11位数字）
	SendLen += LoadToSendBuff(id, &SendTo3GModuleBuff[SendLen]);
//	UART1Write("2C");					  	//发送逗号
	SendLen += LoadToSendBuff(",", &SendTo3GModuleBuff[SendLen]);
//	UART1Write("4241");						//发送数据BA 
	SendLen += LoadToSendBuff("BA", &SendTo3GModuleBuff[SendLen]);

//	Send_Other();							//发送附加信息
//	UART1Write("2641");						//发送“&A”
	SendLen += LoadToSendBuff("&A", &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(time));		    //发送时间（如120000，表示20点0分0秒）
	SendLen += LoadToSendBuff(time, &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(weidu));			//发送经度（如29031975，表示经度2903.1975）
	SendLen += LoadToSendBuff(weidu, &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(jingdu));			//发送纬度（如111392000，表示经度11139.2000）
	SendLen += LoadToSendBuff(jingdu, &SendTo3GModuleBuff[SendLen]);
		
	if(Statu_Flag==1)
		SendLen += LoadToSendBuff("6", &SendTo3GModuleBuff[SendLen]);
//		UART1Write("36");   				//高半字节表示星期（0～6），低半字节表示经纬度
	if(Statu_Flag==0)						//Statu_Flag=0：未定位
		SendLen += LoadToSendBuff("7", &SendTo3GModuleBuff[SendLen]);
//		UART1Write("37");					//Statu_Flag=1：已定位

//	UART1Write(AscllToHEX(speed1));			//发送速度1：2位，单位为两节
	SendLen += LoadToSendBuff(speed1, &SendTo3GModuleBuff[SendLen]);
//	UART1Write("3030");	 					//发送“00“，表示方向，单位是10度，正北为0度，顺时针方向
	SendLen += LoadToSendBuff("00", &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(date));			//发送日期，格式为ddmmyy,顺序为日，月，年
	SendLen += LoadToSendBuff(date, &SendTo3GModuleBuff[SendLen]);
//	UART1Write("26423031303038");			//发送报警状态信息：&B0100804000或B0000000000分别表示为超速报警与正常
	SendLen += LoadToSendBuff("&B01008", &SendTo3GModuleBuff[SendLen]);		
//	UART1Write("3030303030");
	SendLen += LoadToSendBuff("00000", &SendTo3GModuleBuff[SendLen]);

//	UART1Write("2646");						//发送附加信息起始符	&F
	SendLen += LoadToSendBuff("&F", &SendTo3GModuleBuff[SendLen]);
//	UART1Write(AscllToHEX(speed2));			//发送速度2，如&F0458表示当前速度为45.8节，即84.8 Km/h。
	SendLen += LoadToSendBuff(speed2, &SendTo3GModuleBuff[SendLen]);


//	UART1Write("23\"");						//发送结束符‘#’
	SendLen += LoadToSendBuff("#", &SendTo3GModuleBuff[SendLen]);

//	UART1_SendByte('\r');					//发送结束	
	SendTo3GModuleBuff[2] = (SendLen-4) >> 8;
	SendTo3GModuleBuff[3] = (SendLen-4) & 0xFF;	   		//数据长度

	Crc_Tmp = CalCrc((char *)&SendTo3GModuleBuff[2], SendLen-2);
	SendTo3GModuleBuff[SendLen++] = Crc_Tmp & 0xFF;		//校验码
	SendTo3GModuleBuff[SendLen++] = 0x55;
	SendTo3GModuleBuff[SendLen++] = 0xAA;				//结束位

	UART1WriteBuff(SendTo3GModuleBuff, SendLen);   		//发送到串口

	Buf_function=Function;		
	Function=3;
}

/****************************************************************/
/*函数功能：回传定位信息										*/
/*入口参数：无													*/
/*出口参数：无													*/
/*函数说明：Flag为1表示已定位，0为未定位						*/
/*			Alarm为1表示超速，0为未超速							*/
/****************************************************************/
void Modify_Response(u8 Fun_W[])
{
	u8 Function_Words[5]={"0000"};
	SEND=1;
	START=9;
	REPLY=10;
	
	
	Function_Words[0]=Fun_W[0]/16+0x30;
	Function_Words[1]=Fun_W[0]%16+0x30;
	if(Function_Words[1]>0x39)
	{
	   Function_Words[1]=Function_Words[1]+0x07;
	}
	Function_Words[2]=Fun_W[1]/16+0x30;
	Function_Words[3]=Fun_W[1]%16+0x30;
	if(Function_Words[3]>0x39)
	{
	   Function_Words[3]=Function_Words[3]+0x07;
	}

	UART1Write("AT+MIPSEND=1,");			//发送数据AT指令
	
	UART1Write("\"2A4851323030");			//发送数据头*HQ201 
	
	UART1Write(AscllToHEX(id));				//发送SIM卡号（11位数字）
	
	UART1Write("2C");					  	//发送逗号

	UART1Write("59");					  	//发送'Y'

	UART1Write(Function_Words);						//发送功能关键字 

	UART1Write("23\"");						//发送结束符‘#’

	UART1_SendByte('\r');					//发送结束	
}

/*if(SEND==5)					   		//发送登录信息
	{
		SEND=0;
		START=3;
		Rec_GPRS_Conter=0;
		for(i=0;i<150;i++)
		{
			Rec_GPRS[i]='\0';	 
		}
		begin=0;
		Send_Log();					   //发送登陆信息
	}												   */

void Send_MIPCALL_CONNECT(void)//设置 APN 和活动的 PDP
{
	UART1Write(MIPCALL_CONNECT);
	UART1_SendByte('\r');
}


void Send_MIPCALL(void)	//查询 APN 和活动的 PDP
{
	UART1Write(MIPCALL);
	UART1_SendByte('\r');
}	  


void Send_MIPOPEN_CONNECT(void)//建立TCP连接
{
	UART1Write(MIPOPEN_CONNECT);
	UART1_SendByte('\"');
	UART1Write(IP);
	UART1_SendByte('\"');
	UART1_SendByte(',');
	UART1Write(PORT);
	UART1Write(",0");
	UART1_SendByte('\r');
}


void Send_MIPOPEN(void)	//查询是否建立TCP连接
{
	UART1Write(MIPOPEN);
	UART1_SendByte('\r');
}
   
void Send_MIPSEND(u8* data)	//发送数据指令
{
	UART1Write(MIPSEND);
	UART1Write(data);
	UART1_SendByte('\r');
}

void Send_MIPPUSH(void)	//清除缓冲区内容
{
	UART1Write(MIPPUSH);
	UART1_SendByte('\r');
}

void Send_MIPCLOSE(void)//关闭Socket连接
{
	UART1Write("AT+MIPCLOSE=1\r");

}

/************************************
函数功能：返回数据处理
入口参数：无
出口参数：无
参数说明：针对G600返回的不同数据，进行处理
		  开启相应的标志位
*************************************/
void ReturnMessage_Deal(void)
{
	u8  Tmp8, TmpCrc;
	u16 DataLen, Cmd;
    u8 CrcResult;
    int i = 0;
    
    u8 Temp_Arr[150];
    u8 result = 0;      // 异常
    
	static u8 ConnectFailCount = 0;
	static u8 SendBuffFailCount = 0;
	
	if( (Rec_GPRS[0]!=0x55)||(Rec_GPRS[1] != 0xAA) )	 //协议头错误
	{
		return;	
	}

	DataLen = (Rec_GPRS[2] << 8) + Rec_GPRS[3]; 
	if(DataLen > 150)							  //超出最大长度
	{
		return ;
	}

	Cmd =  (Rec_GPRS[6] << 8) + Rec_GPRS[7]; 	//命令字
	TmpCrc = Rec_GPRS[DataLen + 4];				//校验码

	CrcResult =  CalCrc((char *)&Rec_GPRS[2], (DataLen + 2));
	Tmp8 = 	CrcResult & 0x00FF;

	if(TmpCrc != Tmp8)	 //CRC校验不一致
	{
		return;
	}

	switch(Cmd)
	{
		case 0x0020: 	   //创建透明传输链路
			{
				if(Rec_GPRS[8] == 0x00)	  //创建成功
				{
					GPRS_Init_OK = 1;
                    GPRS_Send_flag = 1;
					Function = 5;
					ConnectFailCount = 0;
                    LOG("Connect ok");
				}
				else					   //失败，继续发送创建透明传输链路
				{
                    LOG("Connect fail");
					GPRS_Init_OK=0;
					ConnectFailCount++;
					if(ConnectFailCount > 3)
					{
						//AT_Command(0x11);		//关闭链路
						ConnectFailCount = 0;
					}
					else
					{
						AT_Command(0x10);	  //重新发送链路创建
					}
				}
				break;		 
			}

		case 0x0021:  //关闭透明传输链路
			{
				if(Rec_GPRS[8] == 0x00)	  //关闭成功
				{
					GPRS_Init_OK=0;
					AT_Command(0x10);	 //重新发送链路创建
				}
				else					  //关闭失败，
				{								
					//AT_Command(0x11);	  //发送链路关闭
				}
				break;		 
			}	 

		case 0x0022: 		 //发送数据到链路
			 {
				 send_time = 0;				// 只要接收到响应，则将发送失败次数清零
				 
				if(Rec_GPRS[13] == 0x00)	  //发送成功
				{
                    LOG("Send OK-Count:%d", send_time);
					
					 GPRS_Init_OK=1;
					 SendBuffFailCount = 0;
				}
				else					  //发送失败，
				{
                    LOG("Send Fail-Count:%d", send_time);
					GPRS_Init_OK=1;	  			//需要重新发送吗？
					SendBuffFailCount++;
					if(SendBuffFailCount > 3)  //发送数据失败超过3次
					{			
						AT_Command(0x10);	  //发送链路连接
						SendBuffFailCount = 0;
						GPRS_Init_OK = 0;
					}
				}
				break;		 
			}


		case 0x0023: //接收到链路上的数据，暂不实现
			GPRS_Init_OK = 1;
            memcpy(Temp_Arr, &Rec_GPRS[9],DataLen - 4);
            //snprintf(Temp_Arr,DataLen,"%X", Rec_GPRS[8]);
            for(i = 0; i < DataLen-4; i++)
            {
                PRINT("%02X ", Temp_Arr[i]);
            }
            PRINT("\r\n");
			
			// 对接收的链路数据进行处理
			// 心跳包的响应
			if((DataLen > 10) && Temp_Arr[6] == 'A' && Temp_Arr[7] == 'H')
			{
				LOG("Heart_rate respose");
				heart_rate_respose = 1;
				no_respose_time = 0;
			}
		
        
        break;		

        case 0x0003:
        {
			GPRS_Init_OK = 1;
            memcpy(Temp_Arr, &Rec_GPRS[8],DataLen-4);
            //snprintf(Temp_Arr,DataLen,"%X", Rec_GPRS[8]);
            for(i = 0; i < DataLen-4; i++)
            {
                PRINT("%02X ", Temp_Arr[i]);
            }
            PRINT("\r\n");
            
            // byte 0 网络状态
            // bit0:拨号状态 1:在线状态 2:离线状态
            
            // byte 1 存储介质状态
            // bit7~4：不用，0~1：SD1，2~3：SD2，0：正常，1：无存储介质，2：未格式化，3：存储介质故障
            
            // byte 2 视频状态，依据录像使能状态进行屏蔽相应通道
            // bit0：CH1，1：CH2，2：CH3，3：CH4，4~7：无用 0：正常，1：视频丢失
            
            // byte 3 录像使能状态
            // bit0：CH1，1：CH2，2：CH3，3：CH4，4~7：无用 0：录像失能，1：录像使能
            
            // byte 4 录像状态，依据录像使能状态进行屏蔽相应通道
            // bit0：CH1，1：CH2，2：CH3，3：CH4，4~7：无用 0：停止录像，1：正常录像
            
            // byte 5 网络链接状态
            // bit0：链路0状态，bit1：链路1状态……  0：链路断开， 1：链路正常
            
			// 处于非在线状态
//			if(Temp_Arr[0] != 0x01)
//			{
//				printf("Off-line\n");
//				GPRS_Init_OK = 0;
//				AT_Command(0x10);	 //重新发送链路创建
//				return;
//			}
			
			
            // 链路断开则重连
            if(Temp_Arr[5] == 0x00)
            {
                LOG("Link lost");
				//GPRS_Init_OK = 0;
				//AT_Command(0x10);	 //重新发送链路创建
                return;
            }
            
            // 除失能外的通道外，还有视频丢失的则报异常
            if((Temp_Arr[2]&Temp_Arr[3]) != 0)
            {
                LOG("Signal lost");
                result |= 0x01;
            }
            
            // 除失能外的通道外，还有停止录像的则报异常
            if((Temp_Arr[3] & (~Temp_Arr[4])) != 0)
            {
                LOG("Record abnormal");
                result |= 0x02;
            }
            
//            switch(result)
//            {                
//                case 0x01:break;        // 视频丢失
//                case 0x02:break;        // 录像异常
//                case 0x03:break;        // 视频丢失 & 录像异常
//                default:break;
//            }
            
			LOG("result:%X",result);
            // 发送到服务器
            send_3G_status(result);
            
            break;
        }

		default: break;

	}
}
/*
void ReturnMessage_Deal(void)
{
	
	if ( (Rec_GPRS[0]=='+')&&(Rec_GPRS[4] == 'X'))
	{
		AT_Command(0x08);	
	}	
	switch(Rec_GPRS[0])
	{
		case '+':
		{
			if(START==10)
			{
			   AT_Command(0x02);break;
			}
			switch(Rec_GPRS[4])					 		//第二行第一个字符为‘+’，则比较接收到的第七位
			{
				case 'C':		//+MIPCALL:			 			//查询连接状态
				{
					if(START==2)
					{
						switch(Rec_GPRS[10])
						{
							case '0':AT_Command(0x01);break;	//获取自身IP失败，重新获取						
							case '1':AT_Command(0x03);break;																		
							default:break;
						}
					}
					else if(START==1)
					{
						 AT_Command(0x03);
					}
									
					break;
				}
				case 'S':		//+MIPSEND:1,0,1234						//目的IP端口状态或数据是否缓存至GSM
				{
					if(Rec_GPRS[5]=='T')	 //+MIPSTAT:1,1
					{
						AT_Command(0x02);						
					}
					else
					{
						switch(Rec_GPRS[12])
						{
							case '1':PUSH++;AT_Command(0x04);break;	  //目的IP端口未连接上,查询IP是否连接上							
							case '0':AT_Command(0x05);;break;	  //数据已缓存至GSM，下一步弹出数据							
							default:break;	
						}
					}
					break;
				}
					

				case 'O':		  //+MIPOPEN:2,3,4
				{
					switch(START)
					{
						case 3:
						{
							if(Rec_GPRS[12]=='1')	//已经连接远程IP  +MIPOPEN: 1,1
							{
							
								AT_Command(0x04);
								IP_CALL=0;
							}
							else
							{
							   AT_Command(0x02);
							}
							break;
						}						
						case 4:
						{
							if(Rec_GPRS[10]=='2')
							{
								
								if(PUSH>=5)
								{
								  PUSH=0;								  
								  AT_Command(0x08);
								}
								else if(PUSH>=1)
								{								  
								   AT_Command(0x05);
								}
								else
								{
							//	   GPRS_Init_OK=1;
								   AT_Command(0x0a);
							//	   Function=5;
									OPEN=0;
								}															
							}
							else
							{
								GPRS_Init_OK=0;
								AT_Command(0x02);								
							}
						}
						break;

						default:break;
					}
					
				}	
				break;	
										
				case 'P':
				{

					if(Rec_GPRS[12]=='0')
					{						
						PUSH=0;
						Push_Down=0;
						GPRS_Init_OK=1;																				
					}
					else if(Rec_GPRS[12]=='2')
					{						 
						 PUSH=0;
						 Push_Down++;
						 if(Push_Down>3)
						 {
						    Push_Down=0;
							AT_Command(0x08);
						 }
						 else
						 {
						 	AT_Command(0x04);
						 }
					}	
					else
					{
						AT_Command(0x04);	
						PUSH++;		  		//发送GPRS就绪信息失败，则查询目标IP端口是否连接上
					}
				}
				break;	
				case 'E':	 //+CGREG: 1(0\1\2\3\4\5)
				{
					if(Rec_GPRS[8]=='1'||Rec_GPRS[8]=='5')
					{
						
						AT_Command(0x02);														
					
					}
					else
					{
					   GPRS_Init_OK=0;
					}
				}
				break;		
				default:break;
			}					   
					   
		}
		break;
					

		case 'E':
		{
			switch(START)
			{
				case 1:{

				       GPRS_Init_OK=0;
						IP_CALL++;
						if(IP_CALL>20)
						{
						   IP_CALL=0;
						   AT_Command(0x08);
						}
						else
						{
						  AT_Command(0x02);
						}
						break;
					   }
				case 2:AT_Command(0x08);break;                //查询指令出错，模块重启
				case 3:{
						GPRS_Init_OK=0;
						 OPEN++;
						if(OPEN>3)
						{
						  OPEN=0;
						  AT_Command(0x08);
						}
						else
						{
						  AT_Command(0x04);
						}
						break;
					  }
				case 4:AT_Command(0x08);break;
				case 5:AT_Command(0x04);PUSH++;break;
				case 6:AT_Command(0x08);break;
				case 7:AT_Command(0x08);break;
				case 11:{
							if(Rec_GPRS[1]=='E')
							{
							  AT_Command(0x08);
							}
							else			//ATE0
							{
							  GPRS_Init_OK=0;
							  AT_Command(0x01);
							}							
							break;	
						}
				case 9:PUSH++;AT_Command(0x04);break;			
				default:break;
			}			
		}
		break;
		
		case 'O':
		{
			switch(START)
			{
				case 1:AT_Command(0x02);break;	
				case 4:AT_Command(0x02);break;		
				case 11:AT_Command(0x01);break;	
				case 10:GPRS_Init_OK=1;Function=5;break;			
				default:break;
			}
			break;
		}
		case 'W':
		{
			if(Rec_GPRS[1]=='a')
			{
				AT_Command(0x0b);
				
			}
			break;
		}
			
		default: break;
	}
}
*/

void AT_Command(u8 Send)
{	
	OSTimeDlyHMSM(0,0,0,100);
	SEND=1;
	switch(Send)
	{
		case 0x01: START=1;Send_MIPCALL_CONNECT();OSTimeDlyHMSM(0,0,2,500); break;
		case 0x02: START=2;Send_MIPCALL();OSTimeDlyHMSM(0,0,2,500); break;
		case 0x03: START=3;Send_MIPOPEN_CONNECT();OSTimeDlyHMSM(0,0,0,50);break;
		case 0x04: START=4;Send_MIPOPEN();break;
		case 0x05: START=5;Send_MIPPUSH();break;
		case 0x06: START=6;Send_MIPCLOSE();break;
		case 0x07: START=7;UART1Write("AT+MIPCALL=1\r");break;
		case 0x08: {
					   START=8;
					   PUSH=0;
					   IP_CALL=0;
					   GPRS_Init_OK=0;
					   GPIO_SetBits(GPIOA,GPIO_Pin_4);
					   OSTimeDlyHMSM(0,0,1,0);
					   GPIO_ResetBits(GPIOA,GPIO_Pin_4);	 //GSM模块重启
					   OSTimeDlyHMSM(0,0,5,0);					   					   
					//   UART1Write("ATE0\r");					   
					   break;
				   }
		case 0x0a: {START=10;UART1Write("AT+CGREG=1\r");break;}
		case 0x0b: {
						START=11;
						UART1Write("ATE0\r");	 
						GPRS_Init_OK=0;
						OSTimeDlyHMSM(0,0,2,0);
						break;
					}

		case 0x10:	GPRS_Init_OK=0; Send_CreatConnect(); g_send_cb = Send_CreatConnect;LOG("Send_CreatConnect"); break;	// 发送创建透明传输链路指令	  2016-6-27	  by yq
		case 0x11:	Send_CloseConnect(); g_send_cb = Send_CloseConnect;LOG("Send_CloseConnect");break;	// 发送创建透明传输链路指令	  2016-6-27	  by yq

		default:SEND=0;break;
	}
	OSTimeDlyHMSM(0,0,0,50); 
}

u8 *AscllToHEX(u8 *Ascll)
{
	
	u8 a,i,b;
	
	a=strlen((char *)Ascll);
	for(i=0;i<a;i++)
	{
		b=*(Ascll++);
		Temp_Array[2*i]=0x30+b/16;
		Temp_Array[2*i+1]=0x30+b%16;

	}

	Temp_Array[2*i+1]='\0';
	Temp_Array[2*i]='\0';

	return Temp_Array;
}

/************************************
函数功能：通过GPRS向上传GPS数据
函数入口：无
函数出口：无
函数说明：
***********************************/
void GPRS_Send_Data(void)
{
	u8 err;
	
	if(Buf_Start==1&&Buf_Send_flag==1)		//如果，有报警信息没发生成功则启动发生
	{
		Buf_Send_flag=0;

		if((Alarm_Num_Up-Alarm_Num_Down>=0)&&Buf_Over==1)
		{
			Alarm_Num_Down = Alarm_Num_Up;
		}
		
	    if((Alarm_Num_Up-Alarm_Num_Down!=0)||((Alarm_Num_Up-Alarm_Num_Down==0)&&Buf_Over))
	    {
		    
			Buf_Data_TO_GPRS(Alarm_Num_Down);
			GPRS_Send_flag=1;	
//			u8_to_Hex(Alarm_Num_Down);
//			UART2_SendString(data_buff);
//			UART2_SendString("Alarm_Num_Down\n");

			Alarm_Num_Down++;
			if(Alarm_Num_Down>159)
			{
				Alarm_Num_Down=0;
				Buf_Over=0;
			}	
		}
		else
		{
		  Buf_Start=0;
		  Alarm_Num_Down=0;
		  Alarm_Num_Up=0;
		  GPRS_Send_flag=0;
		}
    }
	if(GPRS_Send_flag)
	{
		GPRS_Send_flag=0;		
			Buf_flag=0;			
		switch(Function)
		{
			case 1:
			{
				GPRS_Init_OK=0;
				g_send_cb = Heart_Jump; 
				Heart_Jump();
				LOG("Heart_Jump,%08X",SendDataNumber);
				
				OSFlagPend(Flag_Grp, 0x08, OS_FLAG_WAIT_SET_ALL | OS_FLAG_CONSUME, 30, &err);
				if(err == OS_ERR_TIMEOUT)
				{
					LOG("No respose:%d",no_respose_time);
					if((++no_respose_time) > 2)		// 超时3次，则重新建立链路
					{
						no_respose_time = 0;
						AT_Command(0x10);
					}
					
				}
				
				
				break;	   //Function=1,发送心跳包信息 REPLY=8   Function=3;
			}
			case 2:GPRS_Init_OK=0;g_send_cb = Alarm_Message;Alarm_Message();LOG("Alarm_Message:%08X",SendDataNumber);break;  //Function=2,发送报警信息 REPLY=9		Function=3;
			case 3:GPRS_Init_OK=0;g_send_cb = Position;Position();LOG("Position:%08X",SendDataNumber);break;	 	  //Function=3,发送一般定位信息 REPLY=10	 Function=3;
			case 4:GPRS_Init_OK=0;g_send_cb = GPRS_Ready;GPRS_Ready();LOG("GPRS_Ready:%08X",SendDataNumber);break;     //Function=4,发送GPRS就绪信息 REPLY=7 Function=3;
			case 5:GPRS_Init_OK=0;g_send_cb = Send_Log;Send_Log();LOG("Send Login:%08X",SendDataNumber);break;   	 //Function=5,发送登陆信息	 REPLY=6  Function=4
			default:break;
		}		
	}
}

void  GPRS_Buf(void)
{
//		u8_to_Hex(Alarm_Num_Up);
//		UART2_SendString(data_buff);
		if(Function==2)
		{
		   GPRS_Alarm_Data_TO_Buf(Alarm_Num_Up);
//		   UART2_SendString("GPRS_Buf_Alarm\n");
		}
		else
		{
		   GPRS_Data_TO_Buf(Alarm_Num_Up);	
//		   UART2_SendString("GPRS_Buf\n");
		}	
		Alarm_Num_Up++;
		Buf_Start=1;
		if(Alarm_Num_Up>159)
		{
			Alarm_Num_Up=0;
			Buf_Over=1;
		}

}
/************************************
函数功能：GPRS上传失败数据缓存到缓存区
函数入口：Alarm_Num_Up GPRS上传失败的次数
函数出口：无
函数说明：
***********************************/
void  GPRS_Data_TO_Buf(int16_t Alarm_Num_Up)
{
	u8 i;
	for(i=0;i<9;i++)
	{
		GPRS_Data_Buf[Alarm_Num_Up][i]=jingdu[i];
	}
	for(i=0;i<8;i++)
	{
		GPRS_Data_Buf[Alarm_Num_Up][i+9]=weidu[i];
	}
	for(i=0;i<6;i++)
	{
		GPRS_Data_Buf[Alarm_Num_Up][i+17]=time[i];
	}

//	UART2_SendString(time);

	for(i=0;i<6;i++)
	{
		GPRS_Data_Buf[Alarm_Num_Up][i+23]=date[i];
	}
	for(i=0;i<2;i++)
	{
		GPRS_Data_Buf[Alarm_Num_Up][i+29]=speed1[i];
	}
	for(i=0;i<4;i++)
	{
		GPRS_Data_Buf[Alarm_Num_Up][i+31]=speed2[i];
	}
	
	GPRS_Data_Buf[Alarm_Num_Up][35]=Function ;   //记录发送信息的种类
}
/************************************
函数功能：GPRS上传报警数据失败缓存到缓存区
函数入口：Alarm_Num_Up GPRS上传失败的次数
函数出口：无
函数说明：
***********************************/
void  GPRS_Alarm_Data_TO_Buf(int16_t Alarm_Num_Up)
{
	u8 i;
	for(i=0;i<9;i++)
	{
		GPRS_Data_Buf[Alarm_Num_Up][i]=jingdu_Alarm[i];
	}
	for(i=0;i<8;i++)
	{
		GPRS_Data_Buf[Alarm_Num_Up][i+9]=weidu_Alarm[i];
	}
	for(i=0;i<6;i++)
	{
		GPRS_Data_Buf[Alarm_Num_Up][i+17]=time_Alarm[i];
	}

//	UART2_SendString(time_Alarm);

	for(i=0;i<6;i++)
	{
		GPRS_Data_Buf[Alarm_Num_Up][i+23]=date_Alarm[i];
	}
	for(i=0;i<2;i++)
	{
		GPRS_Data_Buf[Alarm_Num_Up][i+29]=speed1_Alarm[i];
	}
	for(i=0;i<4;i++)
	{
		GPRS_Data_Buf[Alarm_Num_Up][i+31]=speed2_Alarm[i];
	}
	if(Alarm==1)								//直道报警数据
	{
		GPRS_Data_Buf[Alarm_Num_Up][35]=0x06;   //记录发送信息的种类
		Alarm=0;
	}
	else if(Alarm_W==1)							//弯道报警数据
	{
		GPRS_Data_Buf[Alarm_Num_Up][35]=0x07;   //记录发送信息的种类
		Alarm_W=0;
	}
	else
	{
		 GPRS_Data_Buf[Alarm_Num_Up][35]=0x03;   //记录发送信息的种类
	}
	GPRS_Data_Buf[Alarm_Num_Up][36]=Alarm_Location_Flag;   //警报位置
}

/************************************
函数功能：GPRS上传缓存区数据
函数入口：Alarm_Num_Down GPRS上传次数
函数出口：无
函数说明：
***********************************/
void  Buf_Data_TO_GPRS(int16_t Alarm_Num_Down)
{
	u8 i;
	u8 temp=0;
	temp=GPRS_Data_Buf[Alarm_Num_Down][35];
	if(temp==0x06||temp==0x07)
	{
		for(i=0;i<9;i++)
		{
			jingdu_Alarm[i]=GPRS_Data_Buf[Alarm_Num_Down][i];
		}
		for(i=0;i<8;i++)
		{
			weidu_Alarm[i]=GPRS_Data_Buf[Alarm_Num_Down][i+9];
		}
		for(i=0;i<6;i++)
		{
			time_Alarm[i]=GPRS_Data_Buf[Alarm_Num_Down][i+17];
		}

//		UART2_SendString("time_Alarm:");
//		UART2_SendString(time_Alarm);
//		UART2_SendString("--");

		for(i=0;i<6;i++)
		{
			date_Alarm[i]=GPRS_Data_Buf[Alarm_Num_Down][i+23];
		}
		for(i=0;i<2;i++)
		{
			speed1_Alarm[i]=GPRS_Data_Buf[Alarm_Num_Down][i+29];
		}
		for(i=0;i<4;i++)
		{
			speed2_Alarm[i]=GPRS_Data_Buf[Alarm_Num_Down][i+31];
		}
		if(temp==0x06)
		{
			Alarm=1;
		}
		else
		{
			Alarm_W=1;
		}
		Alarm_Location_Flag=GPRS_Data_Buf[Alarm_Num_Up][36];
		Function=2;
//		UART2_SendString("Function_OUT\n");
	}
	else
	{
		for(i=0;i<9;i++)
		{
			jingdu[i]=GPRS_Data_Buf[Alarm_Num_Down][i];
		}
		for(i=0;i<8;i++)
		{
			weidu[i]=GPRS_Data_Buf[Alarm_Num_Down][i+9];
		}
		for(i=0;i<6;i++)
		{
			time[i]=GPRS_Data_Buf[Alarm_Num_Down][i+17];			
		}

//		UART2_SendString("time:");
//		UART2_SendString(time);
//		UART2_SendString("--");

		for(i=0;i<6;i++)
		{
			date[i]=GPRS_Data_Buf[Alarm_Num_Down][i+23];
		}
		for(i=0;i<2;i++)
		{
			speed1[i]=GPRS_Data_Buf[Alarm_Num_Down][i+29];
		}
		for(i=0;i<4;i++)
		{
			speed2[i]=GPRS_Data_Buf[Alarm_Num_Down][i+31];
		}
		Function=GPRS_Data_Buf[Alarm_Num_Down][35];		//将缓存的发送信息类型赋值给Function
		
//		UART2_SendString("Function\n");
	}
	
}

void u8_to_Hex(u8 Alarm_Dat)
{	
	data_buff[0]=0x33;
	data_buff[1]=Alarm_Dat/100+0x30;
	data_buff[2]=0x33;
	data_buff[3]=Alarm_Dat%100/10+0x30;
	data_buff[4]=0x33;
	data_buff[5]=Alarm_Dat%10+0x30;
	data_buff[6]='\0';
	return ;
}


void Send_CreatConnect(void)	//通过串口创建3G模块链路
{
	u16 Crc_Tmp = 0;

	SendTo3GModuleBuff[0] = 0x55;
	SendTo3GModuleBuff[1] = 0xAA;	  //起始位

	SendTo3GModuleBuff[2] = 0x00;	  
	SendTo3GModuleBuff[3] = 0x28;	  // 数据包长度40

	SendTo3GModuleBuff[4] = 0x07;	  //设备类型
	SendTo3GModuleBuff[5] = 0x01;  	 //厂商标识

	SendTo3GModuleBuff[6] = 0x00;
	SendTo3GModuleBuff[7] = 0x20;	 //命令字，创建链路

	SendTo3GModuleBuff[8] = 0x00;	 //链路编号
	SendTo3GModuleBuff[9] = 0x01;	  //通信类型，0x01 :TCP  0X02 :UDP

//	SendTo3GModuleBuff[10] = 0x55;	 //服务器IP地址
//	memcpy(&SendTo3GModuleBuff[10], "119.145.192.66", 32);
    memcpy(&SendTo3GModuleBuff[10], IP, 32);
	SendTo3GModuleBuff[42] = 0x09;
	SendTo3GModuleBuff[43] = 0x28;		 //IP端口 2344

//	SendTo3GModuleBuff[42] = 0x19;
//	SendTo3GModuleBuff[43] = 0xD6;		 //IP端口 6614

	Crc_Tmp = CalCrc((char *)&SendTo3GModuleBuff[2], 42);
	SendTo3GModuleBuff[44] = Crc_Tmp & 0xFF;		  //校验

	SendTo3GModuleBuff[45] = 0x55;
	SendTo3GModuleBuff[46] = 0xAA;	 //结尾标识

	UART1WriteBuff(SendTo3GModuleBuff, 47);
}	

void Send_CloseConnect(void)	//通过串口关闭3G模块链路
{

	u16 Crc_Tmp = 0;

	SendTo3GModuleBuff[0] = 0x55;
	SendTo3GModuleBuff[1] = 0xAA;	  //起始位

	SendTo3GModuleBuff[2] = 0x00;	  
	SendTo3GModuleBuff[3] = 0x05;	  // 数据包长度5

	SendTo3GModuleBuff[4] = 0x07;	  //设备类型
	SendTo3GModuleBuff[5] = 0x01;  	 //厂商标识

	SendTo3GModuleBuff[6] = 0x00;
	SendTo3GModuleBuff[7] = 0x21;	 //命令字，创建链路

	SendTo3GModuleBuff[8] = 0x00;	 //链路编号

	Crc_Tmp = CalCrc((char *)&SendTo3GModuleBuff[2], 7);
	SendTo3GModuleBuff[9] = Crc_Tmp & 0xFF;		  //校验

	SendTo3GModuleBuff[10] = 0x55;
	SendTo3GModuleBuff[11] = 0xAA;	 //结尾标识

	UART1WriteBuff(SendTo3GModuleBuff, 12);
}	


//u16 CalCrc(char *ptr, int count)
//{
//	u16 crc = 0;
//	char ii;

//	while(--count >= 0)
//	{
//		crc = crc ^ (int)*ptr++ << 8;
//		ii = 8;
//		do{
//			if(crc & 0x8000)
//			{
//				crc = crc << 1^0x1021;
//			}
//			else
//			{
//				crc = crc << 1;
//			}
//		}while(--ii);
//	}
//	return(crc);
//}

u8 CalCrc(char *ptr, int count)
{
	u8 crc = 0;
//	char ii;

	while(--count >= 0)
	{
        crc ^= *ptr++;
	}
	return(crc);
}




u16 LoadToSendBuff(u8* data, u8 *SendBuff)
{

	u16 DataLen = 0;

	while(*data!='\0')
	{
		*SendBuff = *data;

		*data++;
		*SendBuff++; 
		DataLen++;
	}
	
	return 	DataLen;	
}


void send_3G_status(u8 status)
{
    u16 SendLen = 0, Crc_Tmp;
	SEND=1;
	START=9;
	REPLY=6;
	
	// 非异常值，返回
	if((status & 0x03) == 0)
		return;
	
	SendTo3GModuleBuff[0] = 0x55;
	SendTo3GModuleBuff[1] = 0xAA;			//透传起始位

	SendTo3GModuleBuff[4] = 0x07;		    //设备类型
	SendTo3GModuleBuff[5] = 0x01;		    //厂商标识

	SendTo3GModuleBuff[6] = 0x00;
	SendTo3GModuleBuff[7] = 0x22;		    //透传命令字

	SendTo3GModuleBuff[8] = 0x00;			//链路编号

	SendDataNumber++;
    
    SendTo3GModuleBuff[9] = (SendDataNumber >> 24)&0xff;
    SendTo3GModuleBuff[10] = (SendDataNumber >> 16)&0xff;
	SendTo3GModuleBuff[11] = (SendDataNumber >> 8)&0xff;
	SendTo3GModuleBuff[12] = SendDataNumber & 0xff;		 //透传数据流水号

	SendLen = 13;

	//发送“*HQ200”
	SendLen += LoadToSendBuff("*HQ200", &SendTo3GModuleBuff[SendLen]);
	//发送ID卡号（4位数字）
	SendLen += LoadToSendBuff(id, &SendTo3GModuleBuff[SendLen]);
	SendLen += LoadToSendBuff(",", &SendTo3GModuleBuff[SendLen]);
	//发送“CA”
	SendLen += LoadToSendBuff("CA", &SendTo3GModuleBuff[SendLen]);
    
    if(status == 0x01)
        SendLen += LoadToSendBuff("mhD6hPOemeQ", &SendTo3GModuleBuff[SendLen]); // 视频丢失
    else if(status == 0x02)
        SendLen += LoadToSendBuff("kfnDwR;gguA", &SendTo3GModuleBuff[SendLen]); // 录像异常
    else if(status == 0x03)
        SendLen += LoadToSendBuff("mhD6hPOemeSXfA:wnz7Gv;CX", &SendTo3GModuleBuff[SendLen]); // 视频丢失，录像异常
    else
    {
        
    }

	//发送“&A”
	SendLen += LoadToSendBuff("&A", &SendTo3GModuleBuff[SendLen]);
	//发送时间（如120000，表示20点0分0秒）
	SendLen += LoadToSendBuff(time, &SendTo3GModuleBuff[SendLen]);
	//发送经度（如29031975，表示经度2903.1975）
	SendLen += LoadToSendBuff(weidu, &SendTo3GModuleBuff[SendLen]);
	//发送纬度（如111392000，表示经度11139.2000）
	SendLen += LoadToSendBuff(jingdu, &SendTo3GModuleBuff[SendLen]);
		
	if(Statu_Flag==1)
	SendLen += LoadToSendBuff("6", &SendTo3GModuleBuff[SendLen]);
	//高半字节表示星期（0～6），低半字节表示经纬度
	if(Statu_Flag==0)						//Statu_Flag=0：未定位
	SendLen += LoadToSendBuff("7", &SendTo3GModuleBuff[SendLen]);
	//Statu_Flag=1：已定位

	//发送速度1：2位，单位为两节
	SendLen += LoadToSendBuff(speed1, &SendTo3GModuleBuff[SendLen]);
	//发送“00“，表示方向，单位是10度，正北为0度，顺时针方向
	SendLen += LoadToSendBuff("00", &SendTo3GModuleBuff[SendLen]);
	//发送日期，格式为ddmmyy,顺序为日，月，年
	SendLen += LoadToSendBuff(date, &SendTo3GModuleBuff[SendLen]);
	//发送报警状态信息：&B0100804000或B0000000000分别表示为超速报警与正常
	SendLen += LoadToSendBuff("&B01008", &SendTo3GModuleBuff[SendLen]);		
	
	SendLen += LoadToSendBuff("00000", &SendTo3GModuleBuff[SendLen]);

	//发送附加信息起始符	&F
	SendLen += LoadToSendBuff("&F", &SendTo3GModuleBuff[SendLen]);
	//发送速度2，如&F0458表示当前速度为45.8节，即84.8 Km/h。
	SendLen += LoadToSendBuff(speed2, &SendTo3GModuleBuff[SendLen]);

	SendLen += LoadToSendBuff("#", &SendTo3GModuleBuff[SendLen]);

	SendTo3GModuleBuff[2] = (SendLen-4) >> 8;
	SendTo3GModuleBuff[3] = (SendLen-4) & 0xFF;	   		//数据长度

	Crc_Tmp = CalCrc((char *)&SendTo3GModuleBuff[2], SendLen-2);
	SendTo3GModuleBuff[SendLen++] = Crc_Tmp & 0xFF;		//校验码
	SendTo3GModuleBuff[SendLen++] = 0x55;
	SendTo3GModuleBuff[SendLen++] = 0xAA;				//结束位

	UART1WriteBuff(SendTo3GModuleBuff, SendLen);   		//发送到串口
    
//	Buf_function=Function;
	Function=4;
    OSTimeDlyHMSM(0,0,0,500);
}
